﻿//                                       All rights reserved.
//_________________________________Copyright (c) 2021,LangGe Co.,Ltd_____________________________
//
//   文件名称：osapi.h
//   文件标识：见配置管理计划书
//   描    述：跨平台库接口
//
//   当前版本：1.0
//   作    者：张小刚
//   完成日期：2021.11.03
//_______________________________________________________________________________________________

#ifndef __OSAPI__H
#define __OSAPI__H

#include "ossymbols.h"
#include <stdint.h>

// **************自定义宏**************
#define OSE_OK 0
#define OSE_FAIL -1
#define OSE_CONVERSION_FAILED -2
#define OSE_NULL_POINTER -3
#define OSE_INVALID_PARAM -4
#define OSE_FINDFILE_FAILED -5
#define OSE_BUFFER_OVERFLOW -6
#define OSE_PERMISSION_DENIED -7
#define OSE_FILE_EXIST -8
#define OSE_NO_SUCH_FILE -9
#define OSE_OUT_OF_MEMORY -10
#define OSE_NO_SPACE_LEFT -11
#define OSE_TOO_MANY_OPEN_FILES -12
#define OSE_INVALID_HANDLE_VALUE -13
#define OSE_TIMEOUT -14
#define OSE_EOF -15

enum OsSeekMode
{
    OS_SEEK_SET, /**< osFseek时的seek模式，SET表示从文件头开始计算位移 */
    OS_SEEK_CUR, /**< osFseek时的seek模式，CUR表示从当前位置开始计算位移 */
    OS_SEEK_END	 /**< osFseek时的seek模式, END表示从文件末尾开始计算位移 */
};

enum ResponseTypeEnum
{
    Response_Type_Unknown = 0,
    Response_Type_Json = 1,
    Response_Type_Pb = 2
};

/**
 * @brief 文件句柄
 */
struct OsFileHandle
{
    void *m_pFileHandle = nullptr; /**< 文件句柄 */
    bool m_bAssets = false;		   /**< 是否为Assets目录 */
};

#ifndef NULL
#define NULL 0
#endif

#if defined WIN32_PC || defined WIN32_PDA
#define OS_COLOR_USE_BGR // windows下使用
#endif

#ifdef OS_COLOR_USE_BGR
#define OS_COLOR_ARGB(a, r, g, b) (((a) << 24) + ((b) << 16) + ((g) << 8) + (r))
#define OS_COLOR_RGB(r, g, b) (((b) << 16) + ((g) << 8) + (r))
#define OS_COLOR_GetAlpha(c) (((c)&0xFF000000) >> 24)
#define OS_COLOR_GetBlue(c) (((c)&0xFF0000) >> 16)
#define OS_COLOR_GetGreen(c) (((c)&0x00FF00) >> 8)
#define OS_COLOR_GetRed(c) ((c)&0x0000FF)
#else
#define OS_COLOR_ARGB(a, r, g, b) (((a) << 24) + ((r) << 16) + ((g) << 8) + (b))
#define OS_COLOR_RGB(r, g, b) (((r) << 16) + ((g) << 8) + (b))
#define OS_COLOR_GetAlpha(c) (((c)&0xFF000000) >> 24)
#define OS_COLOR_GetRed(c) (((c)&0xFF0000) >> 16)
#define OS_COLOR_GetGreen(c) (((c)&0x00FF00) >> 8)
#define OS_COLOR_GetBlue(c) ((c)&0x0000FF)
#endif

#define OS_INFINITE 0xFFFFFFFF
#define OS_WAIT_OBJECT_0 ((((unsigned long)0x00000000L)) + 0)
#define OS_WAIT_TIMEOUT 258L

// ****************图形****************
// Todo

// ****************声音****************
/**
 * @brief 设置音量
 * @param level 音量级别（0~20）
 */
void osSetVolumeLevel(uint32_t level);
/**
 * @brief 获取音量（0~20）
 * @return 返回音量
 */
uint32_t osGetVolumeLevel();
/**
 * @brief 播放声音文件
 * @param cPath   文件路径
 */
void osPlaySoundFile(const char *cPath);
/**
 * @brief 播放内存中的音频
 * @param cBuf       指向音频指针
 * @param ui32Size   音频大小
 * @param ui32Type   音频类型（暂时尚未启用）
 */
void osPlaySound(unsigned char *cBuf, uint32_t ui32Size, uint32_t ui32Type = 0);
/**
 * @brief 蜂鸣
 * @param ui32Freq        频率（HZ）
 * @param ui32Duration    时长（毫秒）
 */
void osBeep(const uint32_t ui32Freq, const uint32_t ui32Duration);
/**
 * @brief 初始化
 * @param cResPath   资源路径
 * @note 此函数在使用声音相关函数前必须调用，且前调用osExitTTS前只能调用一次
 */
void osInitTTS(const char *cResPath); // 只需调用一次
/**
 * @brief 退出TTS
 * @note 此函数必须与osInitTTS成对调用，不能重复或单独调用
 */
void osExitTTS(); // 只需调用一次
/**
 * @brief 播放一段文本
 * @param cText  文本
 */
void osPlayTTS(const char *cText);
/**
 * @brief 暂停播放
 */
void osPauseTTS();
/**
 * @brief 恢复播放
 */
void osResumeTTS();
/**
 * @brief 取消播放
 */
void osCancelTTS();
/**
 * @brief 设置TTS合成音量
 * @param level  合成音量(0-20)
 */
void osSetTTSVolumeLevel(const uint32_t level);
/**
 * @brief 获取TTS合成音量(0-20)
 * @return 返回TTS合成音量
 */
uint32_t osGetTTSVolumeLevel();
/**
 * @brief 设置角色
 * @param cName  角色名称
 */
void osSetPlayRole(const char *cName);
/**
 * @brief 获取角色
 * @return 返回当前角色名称
 */
const char *osGetPlayRole();
/**
 * @brief 创建 UUID
 * @param cUuid    返回 UUID
 * @return true    创建成功
 * @return false   创建失败
 */
bool osCreateUUID(char (&cUuid)[64]);
// **************文件操作**************
/**
 * @brief 创建目录
 * @param cPathName 目录名称（编码：UTF-8）
 * @return  0      创建成功
 * @return -1      创建失败
 */
OS_API int32_t osCreateDirectory(const char *cPathName);
/**
 * @brief 创建目录
 * @param cPathName 目录名称（编码：UTF-16）
 * @return  0      创建成功
 * @return -1      创建失败
 */
OS_API int32_t osCreateDirectory(const char16_t *cPathName);
/**
 * @brief 创建目录
 * @param cPathName 目录名称（编码：UTF-32）
 * @return  0      创建成功
 * @return -1      创建失败
 */
OS_API int32_t osCreateDirectory(const char32_t *cPathName);
/**
 * @brief 获取可执行程序的全路径名称（包含可执行程序名称）
 * @param fileName  存储可执行程序全路径名称（编码：UTF-8）
 * @param size      存储区域大小
 * @return 0        失败
 * @return !0       返回复制到fileName的实际字符数量
 */
OS_API uint32_t osGetModuleFileName(char *fileName, const uint32_t size);
/**
 * @brief 获取可执行程序的全路径名称（包含可执行程序名称）
 * @param fileName  存储可执行程序全路径名称（编码：UTF-16）
 * @param size      存储区域大小
 * @return 0        失败
 * @return !0       返回复制到fileName的实际字符数量
 */
OS_API uint32_t osGetModuleFileName(char16_t *fileName, const uint32_t size);
/**
 * @brief 获取可执行程序的全路径名称（包含可执行程序名称）
 * @param fileName  存储可执行程序全路径名称（编码：UTF-32）
 * @param size      存储区域大小
 * @return 0        失败
 * @return !0       返回复制到fileName的实际字符数量
 */
OS_API uint32_t osGetModuleFileName(char32_t *fileName, const uint32_t size);
/**
 * @brief 获取可执行程序的全路径
 * @param cPath    存储可执行程序全路径（编码：UTF-8）
 * @param size     存储区域大小
 * @return 0       失败
 * @return !0      返回复制到cPath的实际字符数量
 */
OS_API uint32_t osGetExePath(char *cPath, const uint32_t size);
/**
 * @brief 获取可执行程序的全路径
 * @param cPath    存储可执行程序全路径（编码：UTF-16）
 * @param size     存储区域大小
 * @return 0       失败
 * @return !0      返回复制到cPath的实际字符数量
 */
OS_API uint32_t osGetExePath(char16_t *cPath, const uint32_t size);
/**
 * @brief 获取可执行程序的全路径
 * @param cPath    存储可执行程序全路径（编码：UTF-32）
 * @param size     存储区域大小
 * @return 0       失败
 * @return !0      返回复制到cPath的实际字符数量
 */
OS_API uint32_t osGetExePath(char32_t *cPath, const uint32_t size);
/**
 * @brief 获得存放资源的目录,默认在windows、Linux下获得可执行程序所在的上一个目录,
 *        在symbian和iphone平台下指定可读写的目录即可(在osapi实现osGetModulePath)
 * @param cPath    存储资源路径（编码：UTF-8）
 * @param size     存储区域大小
 * @return 0       失败
 * @return !0      返回复制到cPath的实际字符数量
 */
OS_API uint32_t osGetModulePath(char *cPath, const uint32_t size);
/**
 * @brief 获得存放资源的目录,默认在windows、Linux下获得可执行程序所在的上一个目录,
 *        在symbian和iphone平台下指定可读写的目录即可(在osapi实现osGetModulePath)
 * @param cPath    存储资源路径（编码：UTF-16）
 * @param size     存储区域大小
 * @return 0       失败
 * @return !0      返回复制到cPath的实际字符数量
 */
OS_API uint32_t osGetModulePath(char16_t *cPath, const uint32_t size);
/**
 * @brief 获得存放资源的目录,默认在windows、Linux下获得可执行程序所在的上一个目录,
 *        在symbian和iphone平台下指定可读写的目录即可(在osapi实现osGetModulePath)
 * @param cPath    存储资源路径（编码：UTF-32）
 * @param size     存储区域大小
 * @return 0       失败
 * @return !0      返回复制到cPath的实际字符数量
 */
OS_API uint32_t osGetModulePath(char32_t *cPath, const uint32_t size);
/**
 * @brief 打开文件
 * @param   cFileName    文件名称（编码：UTF-8）
 * @param   bReadOnly    只读标志
 * @param   bCreateNew   新建标志
 * @return  nullptr     失败
 * @return !nullptr    文件句柄
 * @note   当文件处于 assets 目录中时，cFileName 应该以 assets: 前缀开始
 *         例如： asset:/log/log.log
 * @note   当文件处于安卓系统下的assets目录中时，只读，其它权限将被忽略
 */
OS_API void *osOpenFile(const char *cFileName, const bool bReadOnly, const bool bCreateNew);
/**
 * @brief 打开文件
 * @param   cFileName    文件名称（编码：UTF-16）
 * @param   bReadOnly    只读标志
 * @param   bCreateNew   新建标志
 * @param   bAssets      是否为 assets 目录文件
 * @return  nullptr     失败
 * @return !nullptr    文件句柄
 * @note   当文件处于 assets 目录中时，cFileName 应该以 assets: 前缀开始
 *         例如： asset:/log/log.log
 * @note   当文件处于安卓系统下的assets目录中时，只读，其它权限将被忽略
 */
OS_API void *osOpenFile(const char16_t *cFileName, const bool bReadOnly, const bool bCreateNew);
/**
 * @brief 打开文件
 * @param   cFileName    文件名称（编码：UTF-32）
 * @param   bReadOnly    只读标志
 * @param   bCreateNew   新建标志
 * @param   bAssets      是否为 assets 目录文件
 * @return  nullptr     失败
 * @return !nullptr    文件句柄
 * @note   当文件处于 assets 目录中时，cFileName 应该以 assets: 前缀开始
 *         例如： asset:/log/log.log
 * @note   当文件处于安卓系统下的assets目录中时，只读，其它权限将被忽略
 */
OS_API void *osOpenFile(const char32_t *cFileName, const bool bReadOnly, const bool bCreateNew);
/**
 * @brief 读取文件
 * @param hFile                      文件句柄
 * @param lpBuffer                   数据缓冲区
 * @param nNumberOfBytesToRead       数据缓冲区字节数
 * @param lpNumberOfBytesRead        实际读取的字节数
 * @return true                      文件读取成功
 * @return false                     文件读取失败
 */
OS_API bool osReadFile(void *hFile, void *lpBuffer, const uint32_t nNumberOfBytesToRead, uint32_t *lpNumberOfBytesRead);
/**
 * @brief 写文件
 * @param hFile                     文件句柄
 * @param lpBuffer                  数据缓冲区
 * @param nNumberOfBytesToWrite     数据字节数
 * @param lpNumberOfBytesWritten    实际写入字节数
 * @return true                     写入成功
 * @return false                    写入失败
 * @note  安卓assets目录中的文件不支持写入操作
 */
OS_API bool osWriteFile(void *hFile, void *lpBuffer, const uint32_t nNumberOfBytesToWrite, uint32_t *lpNumberOfBytesWritten);
/**
 * @brief 关闭指定文件
 * @param hCom      文件句柄
 */
OS_API void osCloseFile(void **hCom);
/**
 * @brief 检测指定目录是否存在
 * @param cPath 指定目录（编码：UTF-8）
 * @return true  目录存在
 * @return false 目录不存在
 */
OS_API bool osIsPathExist(const char *cPath);
/**
 * @brief 检测指定目录是否存在
 * @param cPath 指定目录（编码：UTF-16）
 * @return true  目录存在
 * @return false 目录不存在
 */
OS_API bool osIsPathExist(const char16_t *cPath);
/**
 * @brief 检测指定目录是否存在
 * @param cPath 指定目录（编码：UTF-32）
 * @return true  目录存在
 * @return false 目录不存在
 */
OS_API bool osIsPathExist(const char32_t *cPath);
/**
 * @brief 打开指定文件
 * @param filename     文件名称（编码： UTF-8）
 * @param mode         打开模式（r w a b t +）
 * @return nullptr     打开失败
 * @return !nullptr    文件句柄
 * @note   当文件处于 assets 目录中时，cFileName 应该以 assets: 前缀开始
 *         例如： asset:/log/log.log
 * @note   当文件处于安卓系统下的assets目录中时，只读，其它权限将被忽略
 */
OS_API void *osFopen(const char *filename, const char *mode);
/**
 * @brief 打开指定文件
 * @param filename     文件名称（编码： UTF-16）
 * @param mode         打开模式（r w a b t +）
 * @param bAssets      是否为安卓assets目录中的内容
 * @return nullptr     打开失败
 * @return !nullptr    文件句柄
 * @note   当文件处于 assets 目录中时，cFileName 应该以 assets: 前缀开始
 *         例如： asset:/log/log.log
 * @note   当文件处于安卓系统下的assets目录中时，只读，其它权限将被忽略
 */
OS_API void *osFopen(const char16_t *filename, const char16_t *mode);
/**
 * @brief 打开指定文件
 * @param filename     文件名称（编码： UTF-32）
 * @param mode         打开模式（r w a b t +）
 * @param bAssets      是否为安卓assets目录中的内容
 * @return nullptr     打开失败
 * @return !nullptr    文件句柄
 * @note   当文件处于 assets 目录中时，cFileName 应该以 assets: 前缀开始
 *         例如： asset:/log/log.log
 * @note   当文件处于安卓系统下的assets目录中时，只读，其它权限将被忽略
 */
OS_API void *osFopen(const char32_t *filename, const char32_t *mode);
/**
 * @brief 读取指定文件
 * @param buf            存储读取数据的空间
 * @param size           每个元素大小，以字节为单位
 * @param count          元素个数
 * @param filehandle     文件句柄
 * @return >0            实际读取的元素个数
 * @return <=0           读取失败
 */
OS_API int32_t osFread(char *buf, const int32_t size, const int32_t count, void *filehandle);
/**
 * @brief 将缓冲区中内容，写入文件中
 * @param buf              缓冲区
 * @param size             每个缓冲区元素尺寸
 * @param count            缓冲区中存储元素个数
 * @param filehandle       文件句柄
 * @return >0              实际写入文件元素个数
 * @return <=0             写入失败
 * @note 如果文件位于安卓assets目录下，则不支持此操作，assets目录只读
 */
OS_API int32_t osFwrite(const char *buf, const int32_t size, const int32_t count, void *filehandle);
/**
 * @brief 冲洗流中的信息，强迫将缓冲区内的数据
 *        写回参数filehandle指定的文件中
 * @param filehandle     文件句柄
 * @return  0    操作成功
 * @return !0    操作失败
 * @note 如果文件位于安卓assets目录下，则不支持此操作，assets目录只读
 */
OS_API int32_t osFflush(void *filehandle);
/**
 * @brief 设置流filehandle的文件位置为给定的偏移offset，
 *        参数offset意味着从给定的seekmode位置查找的字
 *        节数。
 * @param filehandle     文件句柄
 * @param offset         这是相对seekmode的偏移量，以字节为单位。
 * @param seekmode       这是表示开始添加偏移 offset 的位置。
 *                       SEEK_SET=0	文件的开头
 *                       SEEK_CUR=1	文件指针的当前位置
 *                       SEEK_END=2	文件的末尾
 * @return 0             成功
 * @return !0            失败
 * @note iOS系统目前只支持SEEK_SET的偏移，seekmode将被忽略
 * @note iOS 13.0 以上版本才支持此操作
 */
OS_API int32_t osFseek(void *filehandle, const int64_t offset, const int32_t seekmode);
/**
 * @brief 返回给定流filehandle的当前文件位置。
 * @param filehandle    文件句柄
 * @return -1           错误
 * @return !-1          返回位置标识符的当前位置值。
 * @note 如果文件位于安卓assets目录下，则不支持此操作。
 * @note iOS 13.0 以上版本才支持此操作
 */
OS_API int64_t osFtell(void *filehandle);
/**
 * @brief 从指定的流filehandle读取一行，并把它存储在buf所指向的字符串内
 *        当读取 (n-1) 个字符时，或者读取到换行符时，或者到达文件末尾时，
 *        它会停止，具体视情况而定。
 * @param buf              这是指向一个字符数组的指针，该数组存储了要读取的字符串。
 * @param size             这是要读取的最大字符数（包括最后的空字符）。通常是使用
 *                         以buf传递的数组长度。
 * @param filehandle       这是指向 FILE 对象的指针，该 FILE 对象标识了要从中读
 *                         取字符的流。
 * @return nullptr         读取失败
 * @return !nullptr        该函数返回相同的buf参数
 * @note 如果文件位于安卓assets目录下，则不支持此操作。
 * @note iOS暂不支持此操作
 */
OS_API char *osFgets(char *buf, const int32_t size, void *filehandle);
/**
 * @brief 关闭流 filehandle。刷新所有的缓冲区。
 * @param filehandle       文件句柄
 * @return 0               操作成功
 * @return !0              操作失败
 */
OS_API int32_t osFclose(void *filehandle);
/**
 * @brief 增加文件尺寸获取接口
 * @param filehandle       文件句柄
 * @return <0              获取文件尺寸失败
 * @return >=0             获取文件尺寸成功
 */
OS_API int64_t osFsize(void *filehandle);

// 宽字符
typedef void *osHandle;

// **************字符串操作(由libc实现)**************
void osSwapBytes2(void *p0);
void osSwapBytes4(void *p0);
/**
 * @brief 格式化字符串
 * @param buf       缓冲区，用来存储格式化后的结果
 * @param size      缓冲区尺寸
 * @param format    格式控制字符串
 * @param ...       格式控制参数
 * @return 如果格式化后的字符串长度小于 size，则会把字符串全部复制到 str 中，并给其后添加一个字符串结束符 \0；
 *         如果格式化后的字符串长度大于等于 size，超过 size 的部分会被截断，只将其中的 (size-1) 个字符复制到
 *         str 中，并给其后添加一个字符串结束符 \0，返回值为欲写入的字符串长度。
 * @note   编码格式 UTF-8
 */
OS_API int32_t ossnprintf(char *buf, const int32_t size, const char *format, ...);
/**
 * @brief 格式化字符串
 * @param buf       缓冲区，用来存储格式化后的结果
 * @param size      缓冲区尺寸
 * @param format    格式控制字符串
 * @param ...       格式控制参数
 * @return 如果格式化后的字符串长度小于 size，则会把字符串全部复制到 str 中，并给其后添加一个字符串结束符 \0；
 *         如果格式化后的字符串长度大于等于 size，超过 size 的部分会被截断，只将其中的 (size-1) 个字符复制到
 *         str 中，并给其后添加一个字符串结束符 \0，返回值为欲写入的字符串长度。
 * @note   编码格式 UTF-16
 */
OS_API int32_t ossnprintf(char16_t *buf, const int32_t count, const char *format, ...);
/**
 * @brief 格式化字符串
 * @param buf       缓冲区，用来存储格式化后的结果
 * @param size      缓冲区尺寸
 * @param format    格式控制字符串
 * @param ...       格式控制参数
 * @return 如果格式化后的字符串长度小于 size，则会把字符串全部复制到 str 中，并给其后添加一个字符串结束符 \0；
 *         如果格式化后的字符串长度大于等于 size，超过 size 的部分会被截断，只将其中的 (size-1) 个字符复制到
 *         str 中，并给其后添加一个字符串结束符 \0，返回值为欲写入的字符串长度。
 * @note   编码格式 UTF-32
 */
OS_API int32_t ossnprintf(char32_t *buf, const int32_t count, const char *format, ...);
/**
 * @brief 计算指定字符串长度
 * @param str  指定字符串
 * @return 返回指定字符串长度
 */
OS_API int32_t osstrlen(const char *str);
/**
 * @brief 计算指定字符串长度
 * @param str  指定字符串
 * @return 返回指定字符串长度
 */
OS_API int32_t osstrlen(const char16_t *str);
/**
 * @brief 计算指定字符串长度
 * @param str  指定字符串
 * @return 返回指定字符串长度
 */
OS_API int32_t osstrlen(const char32_t *str);
/**
 * @brief 实现字符串拷贝
 * @param dest  字符串存储区域
 * @param src   待拷贝字符串
 * @return 返回字符串存储区域地址
 * @note 编码格式 UTF-8
 */
OS_API char *osstrcpy(char *dest, const char *src);
/**
 * @brief 实现字符串拷贝
 * @param dest  字符串存储区域
 * @param src   待拷贝字符串
 * @return 返回字符串存储区域地址
 * @note 编码格式 UTF-16
 */
OS_API char16_t *osstrcpy(char16_t *dest, const char16_t *src);
/**
 * @brief 实现字符串拷贝
 * @param dest  字符串存储区域
 * @param src   待拷贝字符串
 * @return 返回字符串存储区域地址
 * @note 编码格式 UTF-32
 */
OS_API char32_t *osstrcpy(char32_t *dest, const char32_t *src);
/**
 * @brief 实现字符串拼接
 * @param dest  待拼接字符串（此存储区需要足够大，能够容纳拼接后字符串）
 * @param src   待拼接字符串
 * @return 返回拼接后字符串指针
 * @note 编码格式 UTF-8
 */
OS_API char *osstrcat(char *dest, const char *src);
/**
 * @brief 实现字符串拼接
 * @param dest  待拼接字符串（此存储区需要足够大，能够容纳拼接后字符串）
 * @param src   待拼接字符串
 * @return 返回拼接后字符串指针
 * @note 编码格式 UTF-16
 */
OS_API char16_t *osstrcat(char16_t *dest, const char16_t *src);
/**
 * @brief 实现字符串拼接
 * @param dest  待拼接字符串（此存储区需要足够大，能够容纳拼接后字符串）
 * @param src   待拼接字符串
 * @return 返回拼接后字符串指针
 * @note 编码格式 UTF-32
 */
OS_API char32_t *osstrcat(char32_t *dest, const char32_t *src);
/**
 * @brief 实现字符串中查找指定字符功能
 * @param str  字符串
 * @param ch   指定字符
 * @return 返回字符串中，指向指定字符的指针
 * @note 编码格式 UTF-8
 */
OS_API char *osstrchr(const char *str, const char ch);
/**
 * @brief 实现字符串中查找指定字符功能
 * @param str  字符串
 * @param ch   指定字符
 * @return 返回字符串中，指向指定字符的指针
 * @note 编码格式 UTF-16
 */
OS_API char16_t *osstrchr(const char16_t *str, const char16_t ch);
/**
 * @brief 实现字符串中查找指定字符功能
 * @param str  字符串
 * @param ch   指定字符
 * @return 返回字符串中，指向指定字符的指针
 * @note 编码格式 UTF-32
 */
OS_API char32_t *osstrchr(const char32_t *str, const char32_t ch);
/**
 * @brief 在字符串str1中查找第一次出现子字符串str2的位置
 * @param str1   字符串
 * @param str2   子字符串
 * @return 该函数返回在str1中第一次出现str2字符串的位置，如果未找到则返回nullptr。
 * @note 编码格式 UTF-8
 */
OS_API char *osstrstr(const char *str1, const char *str2);
/**
 * @brief 在字符串str1中查找第一次出现子字符串str2的位置
 * @param str1   字符串
 * @param str2   子字符串
 * @return 该函数返回在str1中第一次出现str2字符串的位置，如果未找到则返回nullptr。
 * @note 编码格式 UTF-16
 */
OS_API char16_t *osstrstr(const char16_t *str1, const char16_t *str2);
/**
 * @brief 在字符串str1中查找第一次出现子字符串str2的位置
 * @param str1   字符串
 * @param str2   子字符串
 * @return 该函数返回在str1中第一次出现str2字符串的位置，如果未找到则返回nullptr。
 * @note 编码格式 UTF-32
 */
OS_API char32_t *osstrstr(const char32_t *str1, const char32_t *str2);
/**
 * @brief 把s1所指向的字符串和s2所指向的字符串进行比较
 * @param s1   要进行比较的第一个字符串
 * @param s2   要进行比较的第二个字符串
 * @return 如果返回值小于 0，则表示 s1小于s2。
 * @return 如果返回值大于 0，则表示 s1大于s2。
 * @return 如果返回值等于 0，则表示 s1等于s2。
 * @note 编码格式 UTF-8
 */
OS_API int32_t osstrcmp(const char *s1, const char *s2);
/**
 * @brief 把s1所指向的字符串和s2所指向的字符串进行比较
 * @param s1   要进行比较的第一个字符串
 * @param s2   要进行比较的第二个字符串
 * @return 如果返回值小于 0，则表示 s1小于s2。
 * @return 如果返回值大于 0，则表示 s1大于s2。
 * @return 如果返回值等于 0，则表示 s1等于s2。
 * @note 编码格式 UTF-16
 */
OS_API int32_t osstrcmp(const char16_t *s1, const char16_t *s2);
/**
 * @brief 把s1所指向的字符串和s2所指向的字符串进行比较
 * @param s1   要进行比较的第一个字符串
 * @param s2   要进行比较的第二个字符串
 * @return 如果返回值小于 0，则表示 s1小于s2。
 * @return 如果返回值大于 0，则表示 s1大于s2。
 * @return 如果返回值等于 0，则表示 s1等于s2。
 * @note 编码格式 UTF-32
 */
OS_API int32_t osstrcmp(const char32_t *s1, const char32_t *s2);
/**
 * @brief 把s1所指向的字符串和s2所指向的字符串进行比较（不区分大小写）
 * @param s1   要进行比较的第一个字符串
 * @param s2   要进行比较的第二个字符串
 * @return 如果返回值小于 0，则表示 s1小于s2。
 * @return 如果返回值大于 0，则表示 s1大于s2。
 * @return 如果返回值等于 0，则表示 s1等于s2。
 * @note 编码格式 UTF-8
 */
OS_API int32_t osstricmp(const char *s1, const char *s2);
/**
 * @brief 把s1所指向的字符串和s2所指向的字符串进行比较（不区分大小写）
 * @param s1   要进行比较的第一个字符串
 * @param s2   要进行比较的第二个字符串
 * @return 如果返回值小于 0，则表示 s1小于s2。
 * @return 如果返回值大于 0，则表示 s1大于s2。
 * @return 如果返回值等于 0，则表示 s1等于s2。
 * @note 编码格式 UTF-16
 */
OS_API int32_t osstricmp(const char16_t *s1, const char16_t *s2);
/**
 * @brief 把s1所指向的字符串和s2所指向的字符串进行比较（不区分大小写）
 * @param s1   要进行比较的第一个字符串
 * @param s2   要进行比较的第二个字符串
 * @return 如果返回值小于 0，则表示 s1小于s2。
 * @return 如果返回值大于 0，则表示 s1大于s2。
 * @return 如果返回值等于 0，则表示 s1等于s2。
 * @note 编码格式 UTF-32
 */
OS_API int32_t osstricmp(const char32_t *s1, const char32_t *s2);
/**
 * @brief 把str1和str2进行比较，最多比较前num个字节。
 * @param str1    要进行比较的第一个字符串。
 * @param str2    要进行比较的第二个字符串。
 * @param num     要比较的最大字符数。
 * @return 如果返回值小于 0，则表示 str1小于str2。
 * @return 如果返回值大于 0，则表示 str1大于str2。
 * @return 如果返回值等于 0，则表示 str1等于str2。
 * @note 编码格式 UTF-8
 */
OS_API int32_t osstrincmp(const char *str1, const char *str2, const int32_t num);
/**
 * @brief 把str1和str2进行比较，最多比较前num个字节。
 * @param str1    要进行比较的第一个字符串。
 * @param str2    要进行比较的第二个字符串。
 * @param num     要比较的最大字符数。
 * @return 如果返回值小于 0，则表示 str1小于str2。
 * @return 如果返回值大于 0，则表示 str1大于str2。
 * @return 如果返回值等于 0，则表示 str1等于str2。
 * @note 编码格式 UTF-16
 */
OS_API int32_t osstrincmp(const char16_t *str1, const char16_t *str2, const int32_t num);
/**
 * @brief 把str1和str2进行比较，最多比较前num个字节。
 * @param str1    要进行比较的第一个字符串。
 * @param str2    要进行比较的第二个字符串。
 * @param num     要比较的最大字符数。
 * @return 如果返回值小于 0，则表示 str1小于str2。
 * @return 如果返回值大于 0，则表示 str1大于str2。
 * @return 如果返回值等于 0，则表示 str1等于str2。
 * @note 编码格式 UTF-32
 */
OS_API int32_t osstrincmp(const char32_t *str1, const char32_t *str2, const int32_t num);
/**
 * @brief 将指定英文字母转为小写英文字母
 * @param c 指定英文字母
 * @return 返回转换后的英文字符
 * @note 编码格式 UTF-8
 * @note for faster implementations, this functions can be a table search
 */
OS_API char ostolower(const char c);
/**
 * @brief 将指定英文字母转为小写英文字母
 * @param c 指定英文字母
 * @return 返回转换后的英文字符
 * @note 编码格式 UTF-16
 * @note for faster implementations, this functions can be a table search
 */
OS_API char16_t ostolower(const char16_t c);
/**
 * @brief 将指定英文字母转为小写英文字母
 * @param c 指定英文字母
 * @return 返回转换后的英文字符
 * @note 编码格式 UTF-32
 * @note for faster implementations, this functions can be a table search
 */
OS_API char32_t ostolower(const char32_t c);
/**
 * @brief 复制字符串
 * @param str 待赋值字符串
 * @return 返回一字符串指针，该指针指向复制后的新字符串地址。
 *         若返回nullptr表示内存不足。
 * @note 编码格式 UTF-8
 */
OS_API char *osstrdup(const char *str);
/**
 * @brief 复制字符串
 * @param str 待赋值字符串
 * @return 返回一字符串指针，该指针指向复制后的新字符串地址。
 *         若返回nullptr表示内存不足。
 * @note 编码格式 UTF-16
 */
OS_API char16_t *osstrdup(const char16_t *str);
/**
 * @brief 复制字符串
 * @param str 待赋值字符串
 * @return 返回一字符串指针，该指针指向复制后的新字符串地址。
 *         若返回nullptr表示内存不足。
 * @note 编码格式 UTF-32
 */
OS_API char32_t *osstrdup(const char32_t *str);
/**
 * @brief 从字符串读取格式化输入
 * @param buf       待检索字符串
 * @param format    格式化字符串
 * @param ...       可变参数，用于返回格式化字符串表示内容
 * @return 如果成功，该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误，则返回 EOF。
 * @note 编码格式 UTF-8
 */
OS_API int32_t ossscanf(const char *buf, const char *format, ...);
/**
 * @brief 从字符串读取格式化输入
 * @param buf       待检索字符串
 * @param format    格式化字符串
 * @param ...       可变参数，用于返回格式化字符串表示内容
 * @return 如果成功，该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误，则返回 EOF。
 * @note 编码格式 UTF-16
 * @note 目前此函数变参只支持UTF-8编码字符串，用户获取后，需要自行转换
 */
OS_API int32_t ossscanf(const char16_t *buf, const char16_t *format, ...);
/**
 * @brief 从字符串读取格式化输入
 * @param buf       待检索字符串
 * @param format    格式化字符串
 * @param ...       可变参数，用于返回格式化字符串表示内容
 * @return 如果成功，该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误，则返回 EOF。
 * @note 编码格式 UTF-32
 * @note 目前此函数变参只支持UTF-8编码字符串，用户获取后，需要自行转换
 */
OS_API int32_t ossscanf(const char32_t *buf, const char32_t *format, ...);
/**
 * @brief 检测一个字符是否是空白符
 *        空白符包括：'' '\t' '\n' '\v' '\f' '\r'
 * @param c 待检测字符
 * @return 返回值为非零（真）表示c是空白符，返回值为零（假）表示c不是空白符
 * @note 此函数同时支持UTF-8、UTF-16以及UTF-32编码格式字符
 */
OS_API int32_t osisspace(const int32_t c);
/**
 * @brief 检测一个字符是否是十进制数字
 * @param c   要检测的字符
 * @return 返回值为非零（真）表示c是十进制数字，返回值为零（假）表示c不是十进制数字
 * @note 此函数同时支持UTF-8、UTF-16以及UTF-32编码格式字符
 */
OS_API int32_t osisdigit(const int32_t c);
/**
 * @brief 把参数 str 所指向的字符串转换为一个整数（类型为 int32_t 型）。
 * @param nptr     要转换为整数的字符串。
 * @return 该函数返回转换后的长整数，如果没有执行有效的转换，则返回零。
 * @note 编码格式 UTF-8
 */
OS_API int32_t osatoi(const char *nptr);
/**
 * @brief 把参数 str 所指向的字符串转换为一个整数（类型为 int32_t 型）。
 * @param nptr     要转换为整数的字符串。
 * @return 该函数返回转换后的长整数，如果没有执行有效的转换，则返回零。
 * @note 编码格式 UTF-16
 */
OS_API int32_t osatoi(const char16_t *nptr);
/**
 * @brief 把参数 str 所指向的字符串转换为一个整数（类型为 int32_t 型）。
 * @param nptr     要转换为整数的字符串。
 * @return 该函数返回转换后的长整数，如果没有执行有效的转换，则返回零。
 * @note 编码格式 UTF-32
 */
OS_API int32_t osatoi(const char32_t *nptr);
/**
 * @brief 用于把整数转换成字符串
 * @param value     为要转换为字符的数字
 * @param str       为转换后的指向字符串的指针
 * @param radix     为转换数字的进制数
 * @return 返回指向转换后的字符串指针
 * @note 编码格式 UTF-8
 */
OS_API char *ositoa(int32_t value, char *str, int32_t radix);
/**
 * @brief 用于把整数转换成字符串
 * @param value     为要转换为字符的数字
 * @param str       为转换后的指向字符串的指针
 * @param radix     为转换数字的进制数
 * @return 返回指向转换后的字符串指针
 * @note 编码格式 UTF-16
 */
OS_API char16_t *ositoa(int32_t value, char16_t *str, int32_t radix);
/**
 * @brief 用于把整数转换成字符串
 * @param value     为要转换为字符的数字
 * @param str       为转换后的指向字符串的指针
 * @param radix     为转换数字的进制数
 * @return 返回指向转换后的字符串指针
 * @note 编码格式 UTF-32
 */
OS_API char32_t *ositoa(int32_t value, char32_t *str, int32_t radix);
/**
 * @brief 把参数 str 所指向的字符串转换为一个浮点数（类型为 float 型）。
 * @param buf   要转换为浮点数的字符串
 * @return 函数返回转换后的双精度浮点数，如果没有执行有效的转换，则返回零（0.0）。
 * @note 编码格式 UTF-8
 */
OS_API float osatof(const char *buf);
/**
 * @brief 把参数 str 所指向的字符串转换为一个浮点数（类型为 float 型）。
 * @param buf   要转换为浮点数的字符串
 * @return 函数返回转换后的双精度浮点数，如果没有执行有效的转换，则返回零（0.0）。
 * @note 编码格式 UTF-16
 */
OS_API float osatof(const char16_t *buf);
/**
 * @brief 把参数 str 所指向的字符串转换为一个浮点数（类型为 float 型）。
 * @param buf   要转换为浮点数的字符串
 * @return 函数返回转换后的双精度浮点数，如果没有执行有效的转换，则返回零（0.0）。
 * @note 编码格式 UTF-32
 */
OS_API float osatof(const char32_t *buf);
/**
 * @brief 把 src 所指向的字符串复制到 dest，最多复制 n 个字符。
 *        当 src 的长度小于 n 时，dest 的剩余部分将用空字节填充。
 * @param dest     指向用于存储复制内容的目标数组
 * @param src      要复制的字符串。
 * @param count    要从源中复制的字符数
 * @return 该函数返回最终复制的字符串。
 * @note 编码格式 UTF-8
 */
OS_API char *osstrncpy(char *dest, const char *src, int32_t count);
/**
 * @brief 把 src 所指向的字符串复制到 dest，最多复制 n 个字符。
 *        当 src 的长度小于 n 时，dest 的剩余部分将用空字节填充。
 * @param dest     指向用于存储复制内容的目标数组
 * @param src      要复制的字符串。
 * @param count    要从源中复制的字符数
 * @return 该函数返回最终复制的字符串。
 * @note 编码格式 UTF-16
 */
OS_API char16_t *osstrncpy(char16_t *dest, const char16_t *src, int32_t count);
/**
 * @brief 把 src 所指向的字符串复制到 dest，最多复制 n 个字符。
 *        当 src 的长度小于 n 时，dest 的剩余部分将用空字节填充。
 * @param dest     指向用于存储复制内容的目标数组
 * @param src      要复制的字符串。
 * @param count    要从源中复制的字符数
 * @return 该函数返回最终复制的字符串。
 * @note 编码格式 UTF-32
 */
OS_API char32_t *osstrncpy(char32_t *dest, const char32_t *src, int32_t count);
/**
 * @brief 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾，直到 n 字符长度为止。
 * @param dest   指向目标数组，该数组包含了一个 C 字符串，且足够容纳追加后的字符串，包括额外的空字符。
 * @param src    要追加的字符串。
 * @param count  要追加的最大字符数。
 * @return 该函数返回一个指向最终的目标字符串 dest 的指针。
 * @note 编码格式 UTF-8
 */
OS_API char *osstrncat(char *dest, const char *src, int32_t count);
/**
 * @brief 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾，直到 n 字符长度为止。
 * @param dest   指向目标数组，该数组包含了一个 C 字符串，且足够容纳追加后的字符串，包括额外的空字符。
 * @param src    要追加的字符串。
 * @param count  要追加的最大字符数。
 * @return 该函数返回一个指向最终的目标字符串 dest 的指针。
 * @note 编码格式 UTF-16
 */
OS_API char16_t *osstrncat(char16_t *dest, const char16_t *src, int32_t count);
/**
 * @brief 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾，直到 n 字符长度为止。
 * @param dest   指向目标数组，该数组包含了一个 C 字符串，且足够容纳追加后的字符串，包括额外的空字符。
 * @param src    要追加的字符串。
 * @param count  要追加的最大字符数。
 * @return 该函数返回一个指向最终的目标字符串 dest 的指针。
 * @note 编码格式 UTF-32
 */
OS_API char32_t *osstrncat(char32_t *dest, const char32_t *src, int32_t count);
/**
 * @brief 把 str1 和 str2 进行比较，最多比较前 n 个字节
 * @param s1      要进行比较的第一个字符串。
 * @param s2      要进行比较的第二个字符串。
 * @param count   要比较的最大字符数。
 * @return 如果返回值 < 0，则表示 s1 小于 s2。
 * @return 如果返回值 > 0，则表示 s2 小于 s1。
 * @return 如果返回值 = 0，则表示 s1 等于 s2。
 * @note 编码格式 UTF-8
 */
OS_API int32_t osstrncmp(const char *s1, const char *s2, int32_t count);
/**
 * @brief 把 str1 和 str2 进行比较，最多比较前 n 个字节
 * @param s1      要进行比较的第一个字符串。
 * @param s2      要进行比较的第二个字符串。
 * @param count   要比较的最大字符数。
 * @return 如果返回值 < 0，则表示 s1 小于 s2。
 * @return 如果返回值 > 0，则表示 s2 小于 s1。
 * @return 如果返回值 = 0，则表示 s1 等于 s2。
 * @note 编码格式 UTF-16
 */
OS_API int32_t osstrncmp(const char16_t *s1, const char16_t *s2, int32_t count);
/**
 * @brief 把 str1 和 str2 进行比较，最多比较前 n 个字节
 * @param s1      要进行比较的第一个字符串。
 * @param s2      要进行比较的第二个字符串。
 * @param count   要比较的最大字符数。
 * @return 如果返回值 < 0，则表示 s1 小于 s2。
 * @return 如果返回值 > 0，则表示 s2 小于 s1。
 * @return 如果返回值 = 0，则表示 s1 等于 s2。
 * @note 编码格式 UTF-32
 */
OS_API int32_t osstrncmp(const char32_t *s1, const char32_t *s2, int32_t count);
/**
 * @brief 将指定字符串转为UTF-8编码
 * @param src    待转换字符串（编码: UTF-16）
 * @param dst    存储转换后的字符串（编码：UTF-8）
 * @param count  转换后字符串存储空间可容纳元素的数量
 * @return 返回转换后字符串长度（元素个数并非字节数）,如果转换后的长度大于等于存储空间尺寸（count）
 *         此时，函数将截断字符串，并将存储空间最后一位设置为'\0'
 */
OS_API int32_t osConvertToUTF8(const char16_t *src, char *dst, const int32_t count);
/**
 * @brief 将指定字符串转为UTF-8编码
 * @param src    待转换字符串（编码: UTF-32）
 * @param dst    存储转换后的字符串（编码：UTF-8）
 * @param count  转换后字符串存储空间可容纳元素的数量
 * @return 返回转换后字符串长度（元素个数并非字节数）,如果转换后的长度大于等于存储空间尺寸（count）
 *         此时，函数将截断字符串，并将存储空间最后一位设置为'\0'
 */
OS_API int32_t osConvertToUTF8(const char32_t *src, char *dst, const int32_t count);
/**
 * @brief 将指定字符串转为UTF-8编码
 * @param src    待转换字符串（编码: UTF-32）
 * @param dst    存储转换后的字符串（编码：UTF-8）
 * @param count  转换后字符串存储空间可容纳元素的数量
 * @return 返回转换后字符串长度（元素个数并非字节数）,如果转换后的长度大于等于存储空间尺寸（count）
 *         此时，函数将截断字符串，并将存储空间最后一位设置为'\0'
 */
OS_API int32_t osConvertToUTF16(const char *src, char16_t *dst, const int32_t count);
/**
 * @brief 将指定字符串转为UTF-16编码
 * @param src    待转换字符串（编码: UTF-32）
 * @param dst    存储转换后的字符串（编码：UTF-16）
 * @param count  转换后字符串存储空间可容纳元素的数量
 * @return 返回转换后字符串长度（元素个数并非字节数）,如果转换后的长度大于等于存储空间尺寸（count）
 *         此时，函数将截断字符串，并将存储空间最后一位设置为'\0'
 */
OS_API int32_t osConvertToUTF16(const char32_t *src, char16_t *dst, const int32_t count);
/**
 * @brief 将指定字符串转为UTF-32编码
 * @param src    待转换字符串（编码: UTF-8）
 * @param dst    存储转换后的字符串（编码：UTF-32）
 * @param count  转换后字符串存储空间可容纳元素的数量
 * @return 返回转换后字符串长度（元素个数并非字节数）,如果转换后的长度大于等于存储空间尺寸（count）
 *         此时，函数将截断字符串，并将存储空间最后一位设置为'\0'
 */
OS_API int32_t osConvertToUTF32(const char *src, char32_t *dst, const int32_t count);
/**
 * @brief 将指定字符串转为UTF-32编码
 * @param src    待转换字符串（编码: UTF-16）
 * @param dst    存储转换后的字符串（编码：UTF-32）
 * @param count  转换后字符串存储空间可容纳元素的数量
 * @return 返回转换后字符串长度（元素个数并非字节数）,如果转换后的长度大于等于存储空间尺寸（count）
 *         此时，函数将截断字符串，并将存储空间最后一位设置为'\0'
 */
OS_API int32_t osConvertToUTF32(const char16_t *src, char32_t *dst, const int32_t count);
// **************网络**************

// 新增替换接口
typedef enum
{
    e_GIF,
    e_PNG,
    e_JPG,
    e_TEXT,
    e_BMP,
    e_UNKNOWN
} OSHTTP_FILEFORMAT;

/**
 * @brief 设置 HTTP 参数
 * @param pApiKey           API 主键
 * @param pAppName          APP 名称
 * @param pPackageName      包名
 * @param pSha1             SHA1
 * @param pAppUserId        用户 ID
 */
OS_API void osSetHttpParam(const char *pApiKey, const char *pAppName, const char *pPackageName, const char *pSha1, const char *pAppUserId);

/**
 * @brief 从HTTP上获得文件
 * @param url                  Url地址
 * @param pBuffer              内存地址
 * @param nSizeOfBuffer        返回的pBuffer大小
 * @param pFileFormat          文件格式
 * @param ui64Timeout          超时时长（单位：秒）
 * @return true                成功
 * @return false               失败
 * @note 采用非阻塞模式
 */
OS_API bool osGetHTTPFile(const char *url, char **pBuffer, int32_t &nSizeOfBuffer, char *pFileFormat, const uint64_t ui64Timeout = 30); // 非阻塞式
/**
 * @brief 发送GET请求，并且返回请求应答结果
 * @param cHost                  服务名称、域名或地址 例如：dev-compile01.engine.pickupspot.langgemap
 * @param lPort                  服务端口 例如：80
 * @param cInterface             调用接口 例如：/pickupspot/query?x=116.395167&y=39.902138776001&range=1000&count=2&strategy=2&attachRange=560
 * @param bCompress              标记返回内容是否被压缩
 * @param pBuffer                返回内容
 * @param nSizeOfBuffer          返回内容尺寸（单位：字节）
 * @return true                  函数执行成功
 * @return false                 函数执行失败
 * @note 采用阻塞方式实现
 */
OS_API bool osGetHTTPBuffer(const char *cHost, const int64_t lPort, const char *cInterface,
                            bool &bCompress, char **pBuffer, int32_t &nSizeOfBuffer); // 阻塞式
/**
 * @brief 发送POST请求，并且返回请求应答结果
 * @param cHost              服务名称、域名或地址 例如：dev-compile01.engine.pickupspot.langgemap
 * @param lPort              服务端口 例如：80
 * @param cInterface         调用接口 例如：/pickupspot/query?x=116.395167&y=39.902138776001&range=1000&count=2&strategy=2&attachRange=560
 * @param cPostBody          请求内容 用此参数传递自定义数据
 * @param bCompress          标记返回内容是否被压缩
 * @param pBuffer            返回内容
 * @param nSizeOfBuffer      返回内容尺寸（单位：字节）
 * @param cContentType       内容类型 例如：application/json
 * @return true              函数执行成功
 * @return false             函数执行失败
 * @note 采用阻塞方式实现
 */
OS_API bool osHTTPPost(const char *cHost, const int64_t lPort, const char *cInterface,
                       const char *cPostBody, bool &bCompress, char **pBuffer, int32_t &nSizeOfBuffer,
                       const char *cContentType = nullptr); // 阻塞式
/**
 * @brief 发送GET请求，并且返回请求应答结果
 * @param cHost                  服务名称、域名或地址 例如：dev-compile01.engine.pickupspot.langgemap
 * @param lPort                  服务端口 例如：80
 * @param cInterface             调用接口 例如：/pickupspot/query?x=116.395167&y=39.902138776001&range=1000&count=2&strategy=2&attachRange=560
 * @param bCompress              标记返回内容是否被压缩
 * @param pBuffer                返回内容
 * @param nSizeOfBuffer          返回内容尺寸（单位：字节）
 * @param ui64Timeout            超时时长（单位：秒）
 * @return true                  函数执行成功
 * @return false                 函数执行失败
 * @note 采用非阻塞方式实现
 */
OS_API bool osGetHTTPGetBuffer(const char *cHost, const int64_t lPort, const char *cInterface,
                               bool &bCompress, char **pBuffer, int32_t &nSizeOfBuffer, const uint64_t ui64Timeout = 30); // 新 非阻塞
/**
 * @brief 发送POST请求，并且返回请求应答结果
 * @param cHost              服务名称、域名或地址 例如：dev-compile01.engine.pickupspot.langgemap
 * @param lPort              服务端口 例如：80
 * @param cInterface         调用接口 例如：/pickupspot/query?x=116.395167&y=39.902138776001&range=1000&count=2&strategy=2&attachRange=560
 * @param cPostBody          请求内容 用此参数传递自定义数据
 * @param bCompress          标记返回内容是否被压缩
 * @param pBuffer            返回内容
 * @param nSizeOfBuffer      返回内容尺寸（单位：字节）
 * @param cContentType       请求内容类型： application /json
 * @param ui64Timeout        超时时长（单位：秒）
 * @param enResponseType     服务返回格式，格式不同，请求头中的内容可能会不同
 * @return true              函数执行成功
 * @return false             函数执行失败
 * @note 采用非阻塞方式实现
 */
OS_API bool osGetHTTPPostBuffer(const char *cHost, const int64_t lPort, const char *cInterface,
                                const char *cPostBody, bool &bCompress, char **pBuffer, int32_t &nSizeOfBuffer,
                                const uint64_t ui64Timeout = 30, const char *cContentType = nullptr, ResponseTypeEnum enResponseType = Response_Type_Unknown); // 新 非阻塞
/**
 * @brief 释放HTTP通信过程中，接收结果分配的pBuffer
 * @param pBuffer                   待释放的空间
 */
OS_API void osReleaseHTTPBuffer(char **pBuffer);

///////////////////////////  时间相关  /////////////////////////////////////////////////////////

/**
 * @brief   获取当前系统时间戳
 * @return  返回当前系统时间戳
 * @note    从1970-01-01 00:00:00 开始计时，到现在的毫秒数
 */
OS_API int64_t osGetTickCount();
OS_API int64_t osGetSteadyTickCount();

#endif //______________________________________________文件结束__________________________________________